package main

import "fmt"

type innerS struct {
	in1 int
	in2 int
}

type outerS struct {
	b      int
	c      float32
	int    // 没有变量名 匿名结构体
	innerS //没有变量名，匿名内嵌结构体
}

type A struct {
	ax, ay int
}

type B struct {
	A
	bx, by float32
}

// 内嵌结构体，匿名结构体，命名冲突
func main() {
	outer := new(outerS)
	outer.b = 6
	outer.c = 7.5
	outer.int = 60 //在一个结构体中对于每一种数据类型只能有一个匿名字段。
	outer.in1 = 5  //同样地结构体也是一种数据类型，所以它也可以作为一个匿名字段来使用
	outer.in2 = 10

	fmt.Printf("outer.b is: %d\n", outer.b)
	fmt.Printf("outer.c is: %f\n", outer.c)
	fmt.Printf("outer.int is: %d\n", outer.int)
	fmt.Printf("outer.in1 is: %d\n", outer.in1)
	fmt.Printf("outer.in2 is: %d\n", outer.in2)

	// 使用结构体字面量
	outer2 := outerS{6, 7.5, 60, innerS{5, 10}}
	fmt.Println("outer2 is:", outer2)

	b := B{A{1, 2}, 3.0, 4.0}
	fmt.Println(b.ax, b.ay, b.bx, b.by)
	fmt.Println(b.A)

	//type A struct {a int}
	//type B struct {a, b int}
	//type C struct {A; B}
	//type D struct {B; b float32}
	//var d D
	//var c C
	//使用 c.a 是错误的，到底是 c.A.a 还是 c.B.a 呢？会导致编译器错误：
	//使用 d.b 是没问题的：它是 float32，而不是 B 的 b。如果想要内层的 b 可以通过 d.B.b 得到。

}
